package modell;
import javax.media.j3d.Appearance;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Material;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.vecmath.Color3f;
import javax.vecmath.Vector3f;

import com.sun.j3d.utils.geometry.Cone;
import com.sun.j3d.utils.geometry.Cylinder;


public class Koordinatenkreuz extends BranchGroup {	
	public Koordinatenkreuz(){		
		//Groups und Objekte an KlassenBranchGroup knuepfen
		TransformGroup rotInXTG = new TransformGroup();
		rotInXTG.setTransform(this.rotiereInX());
		TransformGroup rotInYTG = new TransformGroup();
		rotInYTG.setTransform(this.rotiereInY());
		TransformGroup rotInZTG = new TransformGroup();
		rotInZTG.setTransform(this.rotiereInZ());
		TransformGroup skalierTG = new TransformGroup();
		skalierTG.setTransform(this.skaliere());
		
		this.addChild(skalierTG);
		skalierTG.addChild(rotInXTG);
		rotInXTG.addChild(this.erzeugePfeil(200.0f, 0.0f, 0.0f));
		skalierTG.addChild(rotInYTG);
		rotInYTG.addChild(this.erzeugePfeil(0.0f, 200.0f, 0.0f));
		skalierTG.addChild(rotInZTG);
		rotInZTG.addChild(this.erzeugePfeil(0.0f, 0.0f, 200.0f));
		
	}
	
	private BranchGroup erzeugePfeil(float x, float y, float z){
		//Fertigen (auf Ursprung translatierten) Pfeil erzeugen und als BranchGroup ausgeben
		BranchGroup myBolt = new BranchGroup();
		TransformGroup inUrsprungSchieben = new TransformGroup();
		TransformGroup kegelAufZylinderLegen = new TransformGroup();
		
		//TransformGroup erstellen bzw. fuellen
		inUrsprungSchieben.setTransform(this.verschiebeZylinderInUrsprung());
		kegelAufZylinderLegen.setTransform(this.verschiebeKegelAufZylinder());
		
		//Objekte mit Appearance erzeugen
		Appearance myA = new Appearance();
		myA.setMaterial(new Material(new Color3f(x, y, z),
				new Color3f(x, y, z), new Color3f(x, y, z),
						new Color3f(x, y, z), 0.1f));
		
		Cone myCone 		= new Cone(0.03f, 0.05f, myA);
		Cylinder myCylinder = new Cylinder(0.01f, 0.5f, myA);
		
		//Zylinder in den Urpsrung verschieben
		myBolt.addChild(inUrsprungSchieben);
		inUrsprungSchieben.addChild(myCylinder);
		//Kegel auf Zylinder anbringen
		myBolt.addChild(kegelAufZylinderLegen);
		kegelAufZylinderLegen.addChild(myCone);

		return myBolt;
	}
	
	private Transform3D verschiebeZylinderInUrsprung(){
		Transform3D myT = new Transform3D();
		myT.setTranslation(new Vector3f(0.0f, 0.25f, 0.0f));
		return myT;
	}
	
	private Transform3D verschiebeKegelAufZylinder(){
		Transform3D myT = new Transform3D();
		myT.setTranslation(new Vector3f(0.0f, 0.5f, 0.0f));
		return myT;
	}
	
	private Transform3D rotiereInX(){
		Transform3D myT = new Transform3D();
		myT.rotZ(-Math.PI / 2);
		
		return myT;
	}
	
	private Transform3D rotiereInY(){
		Transform3D myT = new Transform3D();
		myT.rotZ(0.0d);
		
		return myT;
	}
	
	private Transform3D rotiereInZ(){
		Transform3D myT = new Transform3D();
		myT.rotX(Math.PI / 2);
		
		return myT;
	}
	
	private Transform3D skaliere(){
		Transform3D myT = new Transform3D();
		myT.setScale(7.0);
		
		return myT;
	}
}
